package com.andy.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * Created by Andy on  2024/4/25 15:31
 * Email: 963069079@qq.com
 */
public class DateUtil {
    private static final String FORMATER_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    private static final String FORMATER_YYYY_MM_DD_HH_MM_SS2 = "yyyy_MM_dd_HH_mm_ss";
    private static final String FORMATER_YYYY_MM_DD = "yyyy-MM-dd";
    private static final String FORMATER_YYYY_MM_DD2 = "yyyyMMdd";
    public static final String FORMATER_HH_MM_SS = "HH:mm:ss";

    /**
     * 返回时间戳
     *
     * @return
     * @throws ParseException
     */
    public static int geIntTime() {
        try {
            long lt = getUtcTimeInMillis(-1).getTime();
            return (int) lt;
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * 获得标准的时间输出  根据时间戳返回时间
     */
    public static String getStandardFormatTime(long time) {
        Date date = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD_HH_MM_SS);
        return sdf.format(date);
    }

    /**
     * 获取时区   以 “+8” 的形式
     *
     * @return 时区
     */
    public static String getCurrentTimeZone() {
        TimeZone tz = TimeZone.getDefault();
        int offsetMinutes = tz.getRawOffset() / 60000;
        char sign = '+';
        if (offsetMinutes < 0) {
            sign = '-';
            offsetMinutes = -offsetMinutes;
        }
        return String.valueOf(sign) + Integer.toString(offsetMinutes / 60);
    }

    /**
     * 获取时区，返回值类型为int类型   以 8 或 -8 的形式
     * 例如，如果设置时区为GMT+10:00，则返回10；例如，如果设置时区为GMT+04:30，则返回4
     *
     * @return 时区
     */
    public static int getCurrentTimeZoneInt() {
        return TimeZone.getDefault().getOffset(System.currentTimeMillis()) / 60000 / 60;
    }

    /**
     * 获取时区，返回值类型为float类型
     * 例如，如果设置时区为GMT+04:30，则返回4.5；如果设置时区为GMT+10:00，则返回值为10；
     * 如果设置时区为GMT+05:45，则返回值为5.75
     *
     * @return 时区
     */
    public static float getCurrentTimeZoneFloat() {
        return ((float) TimeZone.getDefault().getOffset(System.currentTimeMillis())) / 60000 / 60;
    }

    /**
     * 获取时区
     *
     * @return 时区
     */
    public static String getCurrentTimeZone2() {
        TimeZone tz = TimeZone.getDefault();
        return "TimeZone   " + tz.getDisplayName(false, TimeZone.SHORT) + " Timezon id :: " + tz
                .getID();
    }

    /**
     * 根据时间戳获取UTC时间
     *
     * @param milliseconds 毫秒，传-1表示当前
     * @return UTC时间
     */
    public static Date getUtcTimeInMillis(long milliseconds) {
        Calendar cal = Calendar.getInstance();
        if (milliseconds >= 0) {
            cal.setTimeInMillis(milliseconds);
        }
        // Calendar.ZONE_OFFSET  时间偏移量
        // Calendar.DST_OFFSET   夏令时差
        cal.add(Calendar.MILLISECOND, -(cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar
                .DST_OFFSET)));
        return new Date(cal.getTimeInMillis());
    }

    public static String getUtcTime() {
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD_HH_MM_SS);
        return sdf.format(getUtcTimeInMillis(-1));
    }

    public static String getUtcTime(SimpleDateFormat sdf, long milliseconds) {
        return sdf.format(getUtcTimeInMillis(milliseconds));
    }

    /**
     * 根据传入的时间差获取一个格式化的时间（yyyy-MM-dd）
     *
     * @param timeMillis System.currentTimeMillis()
     */
    public static String getMessageStringDate(long timeMillis) {
        // new SimpleDateFormat(FORMATER_YYYY_MM_DD).format(new Date(timeMillis))
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD);
        return sdf.format(getUtcTimeInMillis(timeMillis));
    }

    /**
     * 根据传入的时间戳获取一个格式化的时间（yyyy-MM-dd）
     *
     * @param timeMillis System.currentTimeMillis()
     */
    public static String getStringDate(long timeMillis) {
        // new SimpleDateFormat(FORMATER_YYYY_MM_DD).format(new Date(timeMillis))
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD);
        return sdf.format(timeMillis);
    }

    /***
     * 查询当前的日期
     **/
    public static String getCurrentDate() {
        long nowDate = System.currentTimeMillis();
        Calendar c = Calendar.getInstance();
        c.setTime(new Date(nowDate));
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD);
        return sdf.format(c.getTime());
    }

    /**
     * 根据传入的时间差获取一个格式化的时间（yyyy-MM-dd）
     *
     * @param timeMillis System.currentTimeMillis()
     */
    public static String getStandardDate(long timeMillis) {
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD);
        return sdf.format(timeMillis);
    }

    /**
     * 查询当前日期前(后)x天的日期
     *
     * @param date 当前日期
     * @param day  天数（如果day数为负数,说明是此日期前的天数）
     * @return yyyy-MM-dd
     */
    public static String beforNumDay(Date date, int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_YEAR, day);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD);
        return sdf.format(c.getTime());
    }

    /**
     * 查询当前日期前(后)x天的日期
     *
     * @param date 当前日期
     * @param day  天数（如果day数为负数,说明是此日期前的天数）
     * @return yyyyMMdd
     */
    public static String beforNumberDay(Date date, int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_YEAR, day);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD2);
        return sdf.format(c.getTime());
    }

    /**
     * 根据传入的时间差获取一个格式化的时间（yyyy_MM_dd_HH_mm_ss）
     *
     * @param timeMillis System.currentTimeMillis()
     */
    public static String getFormatStringDateFromPath(long timeMillis) {
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD_HH_MM_SS2);
        return sdf.format(getUtcTimeInMillis(timeMillis));
    }

    /**
     * 根据传入的时间差获取一个UTC格式化的时间（yyyy-MM-dd HH:mm:ss）
     *
     * @param timeMillis System.currentTimeMillis()
     */
    public static String getFormatStringUTCDate(long timeMillis) {
        SimpleDateFormat sdf = new SimpleDateFormat(FORMATER_YYYY_MM_DD_HH_MM_SS);
        return sdf.format(getUtcTimeInMillis(timeMillis));
    }

    /**
     * 根据指定日期获取该日期的时间戳，对应 getFormatStringUTCDate
     *
     * @param formatDateStr 指定的日期  需要2016-01-01 00:00:00这样的格式
     * @return 时间戳
     */
    public static long getUTCTimeMillis(String formatDateStr) {
        if (getTimeMillis(formatDateStr) == 0) {
            return 0;
        }
        return getTimeMillis(formatDateStr) + (TimeZone.getDefault().getRawOffset() + TimeZone
                .getDefault().getDSTSavings());
    }

    /**
     * 根据指定日期获取该日期的时间戳
     *
     * @param formatDateStr 指定的日期  需要2016-01-01 00:00:00这样的格式
     * @return 时间戳
     */
    public static long getStandardTimeMillis(String formatDateStr) {
        if (getTimeMillis(formatDateStr) == 0) {
            return 0;
        }
        return getTimeMillis(formatDateStr);
    }

    /**
     * 根据指定日期获取该日期的时间戳
     *
     * @param formatDateStr 指定的日期  需要2016-01-01 00:00:00这样的格式
     * @return 时间戳
     */
    public static long getTimeMillis(String formatDateStr) {
        SimpleDateFormat format = new SimpleDateFormat(FORMATER_YYYY_MM_DD_HH_MM_SS);
        try {
            return format.parse(formatDateStr).getTime();
        } catch (ParseException e) {
            return 0;
        }
    }



    /**
     * 根据传入的时间戳获得这个时间是在当前年份的第几天
     */
    public static int getDayFoYear(long timeMillis) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(new Date(timeMillis));
        return ca.get(Calendar.DAY_OF_YEAR);
    }

    /**
     * 根据传入的时间得到这个时间于一天的分钟数
     *
     * @return 该时间是这一天的第几分钟 0-1439
     */
    public static int getMinutesByStamp(long timeStamp) {
        Calendar cal = Calendar.getInstance();
        if (timeStamp >= 0) {
            cal.setTimeInMillis(timeStamp);
        }
        cal.add(Calendar.MILLISECOND, -(cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar
                .DST_OFFSET)));
        return cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
    }

    /**
     * 根据时间戳获取时分秒   21:06:30
     *
     * @param timestamp 毫秒值
     */
    public static String getHourStringDate(long timestamp) {
        timestamp /= 1000;
        int h = (int) (timestamp / 60 / 60 % 24);
        int m = (int) (timestamp / 60 % 60);
        int s = (int) (timestamp % 60);
        return (h < 10 ? ("0" + h) : h) + ":" +
                (m < 10 ? ("0" + m) : m) + ":" +
                (s < 10 ? ("0" + s) : s);
    }

    /**
     * 按指定日期时间格式获取当前时间
     *
     * @param pattern 指定的日期时间格式
     * @return 当前时间
     */
    public static String getCurrentTime(String pattern) {
        long time = System.currentTimeMillis();
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        Date date = new Date(time);
        return format.format(date);
    }
}
